package com.example.demo8test;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 电影操作对象：专门负责对象电影数据进行业务处理（上架，下架，查询，封杀某个电影明星的电影）
 */
public class MovieService {
    // 4.准备一个集合容器，存储全部上架的电影数据
    private static List<Movie> movies = new ArrayList<>();
    private static Scanner sc = new Scanner(System.in);

    public void start() {
        while (true) {
            // 3.准备操作界面
            System.out.println();
            System.out.println("====电影信息操作系统===");
            System.out.println("1.上架");
            System.out.println("2.下架某个电影");
            System.out.println("3.查询某个电影");
            System.out.println("4.封杀某个明星");
            System.out.println("5.退出");
            System.out.println("6.展示全部电影");
            System.out.println("7.修改某个电影");
            System.out.print("请您输入操作命令：");
            String command = sc.next();
            switch (command) {
                case "1":
                    // 上架(独立功能独立成方法)
                    addMovie();
                    break;
                case "2":
                    // 下架某个电影
                    deleteMovie();
                    break;
                case "3":
                    // 查询某个电影
                    queryMovie();
                    break;
                case "4":
                    // 封杀某个明星
                    deleteStar();
                    break;
                case "5":
                    System.out.println("退出成功！");
                    return;
                case "6":
                    // 展示全部电影
                    queryAllMovies();
                    break;
                case "7":
                    // 修改某个电影
                    updateMovie();
                    break;
                default:
                    System.out.println("命令有毛病！");
            }
        }
    }

    /**
     * 修改某个电影
     */
    private void updateMovie() {
        System.out.println("===========修改电影============");
        // 1.提示用户输入电影名称 根据电影名称查询电影对象
        System.out.print("请您输入电影名称：");
        String name = sc.next();
        // 2.根据电影名称查询电影对象
        Movie movie = queryMovieByName(name);
        // 判断电影对象是否为空
        if (movie != null) {
            // 3.输入要修改的电影信息,并直接赋值给电影对象
            System.out.print("原来电影名称为<<" + movie.getName() + ">>请您输入新的电影名称：");
            movie.setName(sc.next());
            System.out.print("原电影分数为(<<" + movie.getScore() + ">>请您输入新的电影评分：");
            movie.setScore(sc.nextDouble());
            System.out.print("原电影主演为(<<" + movie.getActor() + ">>请您输入新的电影主演：");
            movie.setActor(sc.next());
            System.out.print("原电影价格为(<<" + movie.getPrice() + ">>请您输入新的电影价格：");
            movie.setPrice(sc.nextDouble());
        }
    }

    /**
     * 下架某个电影
     */
    private void deleteMovie() {
        System.out.println("===========下架电影============");
        // 分析：下架电影就是删除集合中的电影对象
        // 1.提示用户输入要删除的电影名称
        System.out.print("请您输入要删除的电影名称：");
        String name = sc.next();
        // 2.遍历集合，获取每一个电影对象
        for (int i = 0; i < movies.size(); i++) {
            Movie movie = movies.get(i);
            // 3.判断电影名称是否相同
            // 注意这里就使用equals 不使用 contains 因为一次删除一个
            if (movie.getName().equals(name)) {
                // 4.如果相同，删除这个电影对象
                movies.remove(movie);
                i--; // 防止出现并发修改异常
            }
        }
        System.out.println("下架成功！剩下的电影数据");
        queryAllMovies();
    }

    /**
     * 展示全部电影
     */
    private void queryAllMovies() {
        System.out.println("===========全部电影============");
        // 1.判断集合是否为空
        if (movies.isEmpty()) {
            System.out.println("暂无电影！");
            return;
        }

        // 2.遍历集合，获取每一个电影对象
        for (Movie movie : movies) {
            // 3.打印电影信息
            System.out.println(movie.getName() + "  " + movie.getActor() + "  " + movie.getPrice() + "  " + movie.getScore());
        }
    }


    /**
     * 封杀某个明星
     */
    private void deleteStar() {
        System.out.println("===========封杀明星============");
        System.out.print("请您输入要封杀的明星：");
        String actor = sc.next();
        // 1.遍历集合，获取每一个电影对象
        for (int i = 0; i < movies.size(); i++) {
            Movie movie = movies.get(i);
            // 2.判断电影主演是否有包含输入的明星
            if (movie.getActor().contains(actor)) {
                // 3.如果相同，删除这个电影对象
                movies.remove(movie);
                i--; // 防止出现并发修改异常
            }
        }
        System.out.println("封杀成功！剩下的电影数据");
        // 展示全部电影
        queryAllMovies();
    }

    /**
     * 根据电影名称查询某部电影对象展示出来
     */
    private void queryMovie() {
        System.out.println("===========查询电影============");
        System.out.print("请您输入电影名称：");
        String name = sc.next();
        // 根据电影名称查询电影对象返回，展示这个对象数据
        Movie movie = queryMovieByName(name);
        if (movie != null) {
            System.out.println("===========电影信息如下============");
            System.out.println(movie.getName() + "  " + movie.getActor() + "  " + movie.getPrice() + "  " + movie.getScore());
        } else {
            System.out.println("没有找到！");
        }
    }

    /**
     * 通过名称查询电影对象
     *
     * @param name 电影名称
     * @return 匹配名称的电影对象，如果没有找到则返回null
     */
    private Movie queryMovieByName(String name) {
        // 1.遍历集合，获取每一个电影对象
        for (Movie movie : movies) {
            // 2.判断电影名称是否相同
            if (movie.getName().equals(name)) {
                // 3.如果相同，返回这个电影对象
                return movie;
            }
        }
        // 4.如果循环结束，没有找到，返回null
        return null;
    }

    /**
     * 上架电影
     */
    private void addMovie() {
        System.out.println("===========上架电影============");
        // 分析：每点击上架，就创建一个电影对象，添加到集合中
        // 1.创建电影对象，封装电影信息
        Movie movie = new Movie();

        // 2.给电影对象注入数据
        System.out.print("请您输入电影名称：");
        movie.setName(sc.next());
        System.out.print("请您输入主演：");
        movie.setActor(sc.next());
        System.out.print("请您输入电影价格：");
        movie.setPrice(sc.nextDouble());
        System.out.print("请您输入电影评分：");
        movie.setScore(sc.nextDouble());

        // 3.添加到集合中
        movies.add(movie);
        System.out.println("上架成功！");
    }
}
